As an increasing number of applications and services are being made available over networks such as the Internet, an increasing number of content, application, and service providers are turning to technologies such as remote resource sharing and cloud computing. Cloud computing, in general, is an approach to providing access to electronic resources through services, such as Web services, where the hardware and/or software used to support those services is dynamically scalable to meet the needs of the services at any given time. A user or customer typically will rent, lease, or otherwise pay for access to resources through the cloud, and thus does not have to purchase and maintain the hardware and/or software to provide access to these resources. Multiple users can share resources such as remote servers and data repositories, wherein the users can concurrently send multiple requests to be executed against the same resource. The resources can be physical resources or virtual resources provided through virtualization.
Virtualized computing environments are frequently supported by block-based storage. Such block-based storage provides a storage system that is able to interact with various computing virtualizations through a series of standardized storage calls that render the block-based storage functionally agnostic to the structural and functional details of the volumes that it supports and the operating systems executing on the virtualizations to which it provides storage availability. In order to provide for data redundancy and reduce the likelihood of data loss, many data volumes are replicated with two copies. It can be difficult to maintain consistency between copies due to events such as power failures, lost messages, and dropped connections. Further, conventional replication protocols require in-depth knowledge of the data being replicated, with each new feature wanting to use replication needing to change the replication protocol.